/**
 * @file test_demo.c
 * @author linwanhua (linwanhua@injoinic.com)
 * @brief WT588F02B语音模块原厂例程移植和测试，通信方式为一线串口
 * @version 0.1
 * @date 2024-12-08
 *
 * @copyright Copyright (c) 2024
 *
 */

#include "bsp_delay.h"
#include "main.h"
#include "stdint.h"

#define SET_DATA_HIGH    LL_GPIO_SetOutputPin(Speaker_DATA_GPIO_Port, Speaker_DATA_Pin)
#define SET_DATA_LOW     LL_GPIO_ResetOutputPin(Speaker_DATA_GPIO_Port, Speaker_DATA_Pin)
#define PORT_DELAY_US(n) Delay_us(n)
#define PORT_DELAY_MS(n) Delay_ms(n)

/**
 * @brief 一线串口控制程序（单字节指令）
 * @param data 待发送数据
 */
void Line_1A_WT588F(uint8_t data)
{
    SET_DATA_LOW;     // 拉低数据线
    PORT_DELAY_MS(5); // 延时5ms

    for (uint8_t i = 0; i < 8; i++) {
        if (data & 0X01) { // 逻辑电平1
            SET_DATA_HIGH;
            PORT_DELAY_US(600);
            SET_DATA_LOW;
            PORT_DELAY_US(200);
        }
        else { // 逻辑电平0
            SET_DATA_HIGH;
            PORT_DELAY_US(200);
            SET_DATA_LOW;
            PORT_DELAY_US(600);
        };

        data = data >> 1;
    }

    SET_DATA_HIGH; // 拉高数据线
}

/**
 * @brief 一线串口控制程序（双字节指令）
 * @param data 待发送数据
 */
void Line_1A_WT588F_Couple(uint16_t data)
{
    uint8_t high_byte = data >> 8;    // 获取高字节
    uint8_t low_byte = data & 0xFF;   // 获取低字节

    SET_DATA_LOW;                     // 拉低数据线
    PORT_DELAY_MS(5);                 // 延时5ms
    for (uint8_t i = 0; i < 8; i++) { // 先发高字节
        if (high_byte & 0X01) {       // 逻辑电平1
            SET_DATA_HIGH;
            PORT_DELAY_US(600);
            SET_DATA_LOW;
            PORT_DELAY_US(200);
        }
        else { // 逻辑电平0
            SET_DATA_HIGH;
            PORT_DELAY_US(200);
            SET_DATA_LOW;
            PORT_DELAY_US(600);
        };

        high_byte = high_byte >> 1;
    }
    SET_DATA_HIGH;
    PORT_DELAY_MS(2); // 延时2ms

    SET_DATA_LOW;
    PORT_DELAY_MS(5);                 // 延时5ms
    for (uint8_t i = 0; i < 8; i++) { // 再发低字节
        if (low_byte & 0X01) {        // 逻辑电平1
            SET_DATA_HIGH;
            PORT_DELAY_US(600);
            SET_DATA_LOW;
            PORT_DELAY_US(200);
        }
        else { // 逻辑电平0
            SET_DATA_HIGH;
            PORT_DELAY_US(200);
            SET_DATA_LOW;
            PORT_DELAY_US(600);
        };

        low_byte = low_byte >> 1;
    }

    SET_DATA_HIGH;
}

/* -------------------------------------------------------------------------- */
/*                                    测试函数                                 */
/* -------------------------------------------------------------------------- */

/*--------------------------------------
;模块名称:List_1A_Play_WT588F()
;功    能:一线串口单字节连码示例(F3 + 01 + F3 + 02)
;入    参:
;出    参:
;-------------------------------------*/
void List_1A_Play_WT588F()
{
    Line_1A_WT588F(0xF3);
    PORT_DELAY_MS(2); // 延时2ms
    Line_1A_WT588F(0x01);
    PORT_DELAY_MS(5); // 延时5ms
    Line_1A_WT588F(0xF3);
    PORT_DELAY_MS(2); // 延时2ms
    Line_1A_WT588F(0x02);
    PORT_DELAY_MS(5); // 延时5ms
}

/*--------------------------------------
;模块名称:List_1A_Play_WT588F()
;功    能:一线串口双字节连码示例(FFF3 + 0001 + FFF3 + 0002)
;入    参:
;出    参:
;-------------------------------------*/
void List_1A_Play_WT588F_Couple()
{
    Line_1A_WT588F_Couple(0xFFF3);
    PORT_DELAY_MS(5);  // 延时5ms
    Line_1A_WT588F_Couple(0x0001);
    PORT_DELAY_MS(10); // 延时10ms
    Line_1A_WT588F_Couple(0xFFF3);
    PORT_DELAY_MS(5);  // 延时5ms
    Line_1A_WT588F_Couple(0x0001);
    PORT_DELAY_MS(10); // 延时10ms
}
